local map = vim.keymap.set
require("hlargs").setup({
	hl_priority = 1024 * 16
})
require("nvim-treesitter.install").prefer_git = true
require("nvim-treesitter.configs").setup({
	parser_install_dir = vim.g.parser_install_dir,
	ensure_installed = vim.g.highlight_filetypes,
	sync_install = true,
	highlight = {
		enable = true,
		additional_vim_regex_highlighting = true,
		disable = function(client, bufnr)
			-- disable if semanticTokensProvider or > maxsize
			local caps = client.server_capabilities
			if caps and caps.semanticTokensProvider and caps.semanticTokensProvider.full then
				return true
			end
			local ok, stats = pcall(vim.loop.fs_stat, vim.api.nvim_buf_get_name(bufnr))
			if ok and stats and stats.size > 1024 * 1024 then
				return true
			end
		end,
	},
	incremental_selection = {
		enable = true,
		keymaps = {
			init_selection = '<C-s>',
			scope_incremental = '<C-s>',
			node_incremental = '<TAB>',
			node_decremental = '<S-TAB>',
		},
	},
	matchup = {
		enable = true,
	},
	fold = {
		enable = false,
	},
	indent = {
		enable = false,
	},
})
map("n", "<M-l>t", ":TSUpdate ", { noremap = true, silent = false })
map({ 'n', 'x', 'o' }, 'so', function() require("flash").treesitter() end, { noremap = true, silent = true })
map({ 'x', 'o' }, 'R', function() require("flash").treesitter_search() end, { noremap = true, silent = true })
-------------------------
-- treesitter-textobj
-------------------------
if Installed("nvim-treesitter-textobjects") then
	require("nvim-treesitter.configs").setup({
		textobjects = {
			select = {
				enable = true,
				-- Automatically jump forward to textobj, similar to targets.vim
				lookahead = true,
				keymaps = {
					-- You can use the capture groups defined in textobjects.scm
					["af"] = "@function.outer",
					["if"] = "@function.inner",
					["ac"] = "@class.outer",
					-- You can optionally set descriptions to the mappings (used in the desc parameter of
					-- nvim_buf_set_keymap) which plugins like which-key display
					["ic"] = { query = "@class.inner", desc = "Select inner part of a class region" },
					-- You can also use captures from other query groups like `locals.scm`
					["as"] = { query = "@scope", query_group = "locals", desc = "Select language scope" },
				},
				-- You can choose the select mode (default is charwise 'v')
				--
				-- Can also be a function which gets passed a table with the keys
				-- * query_string: eg '@function.inner'
				-- * method: eg 'v' or 'o'
				-- and should return the mode ('v', 'V', or '<c-v>') or a table
				-- mapping query_strings to modes.
				selection_modes = {
					["@parameter.outer"] = "v", -- charwise
					["@function.outer"] = "V", -- linewise
					["@class.outer"] = "<c-v>", -- blockwise
				},
				-- If you set this to `true` (default is `false`) then any textobject is
				-- extended to include preceding or succeeding whitespace. Succeeding
				-- whitespace has priority in order to act similarly to eg the built-in
				-- `ap`.
				--
				-- Can also be a function which gets passed a table with the keys
				-- * query_string: eg '@function.inner'
				-- * selection_mode: eg 'v'
				-- and should return true of false
				include_surrounding_whitespace = true,
			},
			move = {
				enable = true,
				set_jumps = true, -- whether to set jumps in the jumplist
				goto_next_start = {
					["]]"] = "@function.outer",
					["]o"] = "@class.outer",
				},
				goto_previous_start = {
					["[["] = "@function.outer",
					["[o"] = "@class.outer",
				},
				goto_next_end = {
					["]}"] = "@function.outer",
					["]O"] = "@class.outer",
				},
				goto_previous_end = {
					["[{"] = "@function.outer",
					["[O"] = "@class.outer",
				},
				-- Below will go to either the start or the end, whichever is closer.
				-- Use if you want more granular movements
				-- Make it even more gradual by adding multiple queries and regex.
				goto_next = {
					["]D"] = "@conditional.outer",
				},
				goto_previous = {
					["[D"] = "@conditional.outer",
				},
			},
		},
	})
end
